package com.gitee.dufafei.spark.util

import java.io.InputStream

import org.apache.log4j.{Level, LogManager, Logger, PropertyConfigurator}
import org.slf4j.bridge.SLF4JBridgeHandler
import org.slf4j.impl.StaticLoggerBinder

/**
 * slf4j只是一个日志标准，并不是日志系统的具体实现。
 * slf4j只做两件事情：
 *  1 提供日志接口
 *  2 提供获取具体日志对象的方法
 *  slf4j-simple、logback都是slf4j的具体实现。
 *  log4j并不直接实现slf4j，但是有专门的一层桥接slf4j-log4j12来实现slf4j。
 */
object Log4jUtil {

  val LOG4J_LOGGER_FACTORY: String = "org.slf4j.impl.Log4jLoggerFactory"

  /**
   * 对于jul-to-slf4j-1.7.5.jar的使用
   * 移除之前存在的handle，安装SLF4JBridgeHandler
   * 应该在application初始化时加入代码
   */
  def install(): Unit = {
    // 移除之前存在的handle
    SLF4JBridgeHandler.removeHandlersForRootLogger()
    // 安装SLF4JBridgeHandler
    SLF4JBridgeHandler.install()
  }

  def init(input: InputStream): Unit = {
    // 每个实现门面slf4j-api的日志实现框架都提供了org.slf4j.impl.StaticLoggerBinder类，
    // 通过委托该类返回一个ILoggerFactory的实现类，从而和具体的日志实现框架进行绑定。
    val binderClass = StaticLoggerBinder.getSingleton.getLoggerFactoryClassStr
    val usingLog4j = binderClass.equals(LOG4J_LOGGER_FACTORY)
    if (usingLog4j) {
      val log4j12Initialized = LogManager.getRootLogger.getAllAppenders.hasMoreElements
      if (!log4j12Initialized) PropertyConfigurator.configure(input)
    }
  }

  def setLog4jLevel(level: Level): Unit = Logger.getRootLogger.setLevel(level)
}
